package com.bamboo.core.domain.response;

import com.bamboo.core.enums.code.CodeCommonEnum;
import com.bamboo.core.enums.code.ICodeEnum;

/**
* @description 接口响应的数据结构体
* @date 2025/3/7 8:44
* @author chenzh
*/
public class R<T> {
    private int code;
    private String message;
    private T data;
    public static final String _CODE = "code";
    public static final String _MESSAGE = "message";
    public static final String _DATA = "data";

    private R(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * @description 用于处理成功时的响应结果，无需返回数据
     * @date 2025/3/7 9:05
     * @author chenzh
     * @param <T> 返回的data类型
     * @return R<T>
     */
    public static <T> R<T> success() {
        return new R<>(CodeCommonEnum.OK.getCode(), CodeCommonEnum.OK.getMsg(), null);
    }

    /**
     * @description 用于处理成功时的响应结果，需要返回数据
     * @date 2025/3/7 9:05
     * @author chenzh
     * @param data 返回的数据
     * @param <T> data的类型
     * @return R<T>
     */
    public static <T> R<T> success(T data) {
        return new R<T>(CodeCommonEnum.OK.getCode(), CodeCommonEnum.OK.getMsg(), data);
    }

    /**
     * @description 用于执行失败时返回自定义错误信息
     * @date 2025/3/7 9:03
     * @author chenzh
     * @param message 错误信息
     * @param <T> 返回的data类型
     * @return R<T>
     */
    public static <T> R<T> fail(String message) {
        return new R<>(CodeCommonEnum.SERVER_ERR.getCode(), message, null);
    }

    /**
     * @description 在全局异常处理器中构建返回数据时会用到
     * @date 2025/3/7 17:49
     * @author chenzh
     * @param code 错误码
     * @param message 错误信息
     * @param <T> 返回的data类型
     * @return R<T>
     */
    public static <T> R<T> fail(int code, String message) {
        return new R<>(code, message, null);
    }

    /**
     * @description 用于处理失败时的响应结果，返回指定错误码
     * @date 2025/3/7 9:06
     * @author chenzh
     * @param codeEnum 错误码枚举
     * @param <T> data的类型
     * @return R<T>
     */
    public static <T> R<T> fail(ICodeEnum codeEnum) {
        return new R<>(codeEnum.getCode(), codeEnum.getMsg(), null);
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
